package liquor.util;

import liquor.constant.StringConstants;
import liquor.core.ThreadLocalConstants;

public class StringUtil {

	/**
	 * 문자열이 비어있는지 판단
	 * NULL 이거나 "" 이면 true 
	 * @param value {@link String}
	 * @return boolean
	 */
	public static boolean isEmpty(String value) {
		return value == null || "".equals(value);
	}
	
	/**
	 * 문자열값이 NULL 이면 빈문자 ""를 반환해준다.
	 * @param value {@link String}
	 * @return boolean
	 */
	public static String nullToEmpty(String value) {
		return value == null ? StringConstants.EMPTY : value; 
	}
	
	
	/**
	 * 카멜케이스영문문자열을 영문대문자의 언더스코어 형태로 변환하는 함수
	 * 
	 * ex) testStringCase -> TEST_STRING_CASE
	 * 
	 * @param camelString 카멜케이스 문자열
	 * @return 언더스코어 문자열
	 */
	public static String camelcaseToUnderscore(String camelString) {
		return camelString.replaceAll("([a-z0-9]*)([A-Z]([a-z0-9])*)", "$1_$2").toUpperCase();
	}
	
	/**
	 *  영문대문자의 언더스코를 카멜케이스영문문자열 형태로 변환하는 함수
	 * 
	 * TEST_STRING_CASE = testStringCase
	 * 
	 * @param underscoreString 언더스코어 문자열
	 * @return 카멜케이스 문자열
	 */
	public static String underscoreToCamelcase(String underscoreString) {
		StringBuffer sb = ThreadLocalConstants.getThreadLocalStringBuffer();
		
		String[] splitted = underscoreString.split(StringConstants.UNDERSCORE);
		
		for (int i=0 ; i<splitted.length ; i++) {
			String firstLetter = splitted[i].substring(0, 1).toLowerCase();
			if (i!=0) {
				firstLetter = firstLetter.toUpperCase();
			}
			sb.append(firstLetter);
			
			try {
				String remainLetters = splitted[i].substring(1).toLowerCase();
				sb.append(remainLetters);
			} catch (Exception e) {
				// do nothing
			}
		}
		
		return sb.toString();
	}
}
